﻿////n 个小朋友围成一圈，玩数数游戏。
////小朋友们按顺时针顺序，依次编号为 1∼n。
////初始时，1 号小朋友被指定为领头人。
////游戏一共会行进 k 轮。
////在第 i 轮中，领头人会从他的顺时针方向的下一个人开始，按顺时针顺序数 ai 个人。
////其中，最后一个被领头人数到的人被淘汰出局，这也意味着该轮游戏结束。
////出局者的顺时针方向的下一个人被指定为新领头人，引领新一轮游戏。
////例如，假设当游戏即将开始第 i 轮时，还剩下 5 个小朋友，编号按顺时针顺序依次为 8, 10, 13, 14, 16，并且当前领头人为 13 号小朋友，ai = 12，
////则第 i 轮游戏结束后，最后一个被数到的小朋友为 16 号小朋友，他将被淘汰出局，并且处于其下一位的第 8 号小朋友将被指定为新领头人。
////现在，请你求出每一轮次被淘汰的小朋友的编号。
//
////第一行包含两个整数 n, k。
////第二行包含 k 个整数 a1, a2, …, ak。
//
////一行，k 个整数，其中第 i 个整数表示在第 i 轮中被淘汰的小朋友的编号。
//
//
//
//#include <iostream>
//#include <queue>
//using namespace std;
//
//// const int N = 210;
//// int e[N], ne[N], b[N];
//
//const int N = 110;
//int e[N], pre[N], ne[N];
//
//void cut(int idx)   // 删除双向链表 idx 下标的节点
//{
//    ne[pre[idx]] = ne[idx];
//    pre[ne[idx]] = pre[idx];
//    // e[idx] = -1;        // 不用管了，已经遍历不到他了
//}
//
//int main(void)
//{
//    // int n, k;
//    // cin >> n >> k;
//
//    // queue<int> p;     
//    // // 数据量小的时候用队列来模拟（约瑟夫环问题，数据量大的时候用DP，时间复杂度是线性的）
//    // for(int i = 1; i <= n; i++) p.push(i);   
//
//    // while(k--)
//    // {
//    //     int a;
//    //     cin >> a;
//
//    //     a = a % p.size();  // a 超过 p.size() 的话，有些操作不需要的
//    //     for(int i = 0; i < a; i++)
//    //     {
//    //         p.push(p.front());  // 把队头的元素放到队尾（队列的长度变长了 1）
//    //         p.pop();            // 再把对头的元素删除
//    //     }
//
//    //     cout << p.front() << ' ';  // 输出对头的元素
//    //     p.pop();                   // 再删除对头的元素
//    // }
//
//
//    // 自己用的单向循环链表没做成功（下面的做法有问题）
//    //（单向的相比较双向的不好删除数据，容易死循环）
//    // int n, k;          
//    // cin >> n >> k;
//    // for(int i = 1; i <= n; i++) e[i] = i;
//    // for(int i = 1; i <= n; i++) ne[i] = i % n + 1;
//    // for(int i = 1; i <= k; i++) cin >> b[i];
//
//    // int x = 1, cnt = 0;
//    // for(int i = 1; i <= k; i++)
//    // {
//    //     int j = b[i];
//    //     while(j--)
//    //     {
//    //         if(e[x] != 0) x = ne[x];
//    //         while(e[x] == 0) x = x % n + 1;
//    //     }
//
//    //     if(e[x] != 0) 
//    //     {
//    //         cout << e[x] << ' ';
//    //         e[x] = 0;
//    //         //x = x % n + 1;
//    //         cnt++;
//    //         if(cnt == n) break;
//    //         while(e[x] == 0) x = x % n + 1;
//    //         // cnt++;
//    //     }
//    // }
//
//
//    // 别人的题解（双向循环链表）
//    int n, k;
//    cin >> n >> k;
//
//    for (int i = 1; i <= n; i++)
//    {
//        e[i] = i;
//        if (i == 1) pre[i] = n;
//        pre[i + 1] = i % n;    // 越界没关系，N 足够大
//        ne[i] = i % n + 1;
//    }
//
//    int idx = 1;        // 从 1 下标开始
//    while (k--)
//    {
//        int a;
//        cin >> a;
//        a %= n;
//
//        for (int i = 1; i <= a; i++)  // idx 向后走 a 步
//        {
//            idx = ne[idx];
//        }
//        cout << e[idx] << ' ';
//        cut(idx);
//        n--;     // 这一步不能少，cut 删除了一个元素 n（元素的数量就要减少）
//        idx = ne[idx];  // 画图理解，下标 idx 位置的节点虽然在循环链表上，但不会遍历到它。
//     // 没删除前，idx 前面节点的指针指向 idx，输出后 idx 前面节点的指针指向 idx 后面那个节点，所以 idx 要向前走
//    }
//    return 0;
//}
//
